package com.sk.leetcode.arithmetic.test1_10;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 该函数首先根据需要丢弃任意多的空格字符，直到找到第一个非空格字符为止。如果第一个非空字符是正号或负号，选取该符号，并将其与后面尽可能多的连续的数字组合起来，这部分字符即为整数的值。如果第一个非空字符是数字，则直接将其与之后连续的数字字符组合起来，形成整数。
 * 字符串可以在形成整数的字符后面包括多余的字符，这些字符可以被忽略，它们对于函数没有影响。
 * 当字符串中的第一个非空字符序列不是个有效的整数；或字符串为空；或字符串仅包含空白字符时，则不进行转换。
 * 若函数不能执行有效的转换，返回 0。
 * 说明：
 * 假设我们的环境只能存储 32 位有符号整数，其数值范围是 [−231,  231 − 1]。如果数值超过可表示的范围，则返回  INT_MAX (231 − 1) 或 INT_MIN (−231) 。
 */
public class Test8 {
    private static String reg = "^([\\-]|['+']|[0-9]|[' '])+";

    public static void main(String[] args) {
        int n = myAtoi1("  0000000000012345678");
        System.out.println(n);
    }

    /**
     * 正则有问题（待改正）
     * @param str
     * @return
     */
    public static int myAtoi(String str) {
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(str);
        while (matcher.find()) {
            String string = matcher.group();
            System.out.println(string);
            String res = string.trim().replaceAll(" ", "");
            if(res.length() > 11) {
                return 0;
            }
            long num = Long.parseLong(res);
            if(num == (int) num) {
                return (int) num;
            }
        }
        return 0;
    }

    public static int myAtoi1(String str) {
        str = str.trim();
        if(str.length() == 0) {
            return 0;
        }
        char[] chars = str.toCharArray();
        char jian = "-".toCharArray()[0];
        char jia = "+".toCharArray()[0];


        char c0 = "0".toCharArray()[0];
        char c9 = "9".toCharArray()[0];

        StringBuffer buffer = new StringBuffer();
        int n = 0, m = 0;
        boolean b = true;
        for (char c : chars) {
            if(b) {
                if(n == 0 && (c == jian || c == jia)) {
                    if(c == jian) {
                        n--;
                    } else {
                        n++;
                    }
                    buffer.append(c);
                } else if(c >= c0 && c <= c9) {
                    if(n == 0 ) {
                        n++;
                    }
                    if(m == 0 && c==c0) {
                    }else {
                        m++;
                        buffer.append(c);
                    }

                } else {
                    b = false;
                    continue;
                }

            }
        }

        String res = buffer.toString();
        if(res.length() == 0) {
            return 0;
        }
        if(res.length() > 11) {
            if(n > 0) {
                return Integer.MAX_VALUE;
            }
            return Integer.MIN_VALUE;
        }
        try {
            long num = Long.parseLong(res);
            if(num == (int) num) {
                return (int) num;
            } else if(num > Integer.MAX_VALUE) {
                return Integer.MAX_VALUE;
            } else if(num < Integer.MIN_VALUE) {
                return Integer.MIN_VALUE;
            }
        } catch (Exception e) {
            return 0;
        }

        return 0;
    }
}
